/**
 * 获取校验邮箱正则
 */
export function validateEmailRegExp () {
  return /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
}

/**
 * 获取校验手机正则
 */
export function validatePhoneRegExp () {
  return /^1[3456789]\d{9}$/
}

export const validatePassword = function (rule, value, callback, isGeneplus) {
  // 密码必须8~16位
  if (value.length < 8 || value.length > 16) {
    callback(new Error('密码必须在8-16位之间'))
    return
  }
  let count = 0
  const regNum = /\d/
  if (regNum.test(value)) {
    count++
  }
  const regBug = /^.*[A-Z].*/
  if (regBug.test(value)) {
    count++
  }
  const regMin = /^.*[a-z].*/
  if (regMin.test(value)) {
    count = count + 1
  }
  const regSp = /.*[-_`·~!@#$%^&*()+=|{}':;,\[\].<>\/?！￥…（）—【】‘；：”“’。，、？]+.*/
  if (regSp.test(value)) {
    count = count + 1
  }
  if (count < 3) {
    callback(new Error('须大小写字母数字特殊字符三种组合'))
    return
  }
  const regChn = /[\u4e00-\u9fa5]+/
  if (regChn.test(value)) {
    callback(new Error('不能填写中文'))
    return
  }
  if (isGeneplus) {
    // 密码不能使用相同的数字或者字母组合 如 123 abc，111等
    const pasArr = value.split('') // ex:['2','3']
    const isRange = code => {
      const r = [
        [48, 57],
        [97, 122],
        [65, 90]
      ]
      return r.some(v => code >= v[0] && code <= v[1])
    }
    for (let i = 1; i < pasArr.length - 1; i++) {
      // 首先判断是数字和字母 chartCodeAt
      // '0' - '9': 48 - 57
      // 'a' - 'z': 97 - 122
      // 'A' - 'Z': 65 - 90
      const preCode = pasArr[i - 1].charCodeAt()
      const curCode = pasArr[i].charCodeAt()
      const nextCode = pasArr[i + 1].charCodeAt()
      // 首先判断三个都在范围内
      if (isRange(curCode) && isRange(preCode) && isRange(nextCode)) {
        if ((curCode - preCode === 1 && nextCode - curCode === 1) || (curCode - preCode === 0 && nextCode - curCode === 0)) {
          callback(new Error('密码不能是连续或者相同的3位以上数字或者字母组合'))
          return
        }
      }
    }
    // 密码不能带有geneplus（包括大小写）
    if (value.toLowerCase().includes('geneplus')) {
      callback(new Error('密码不能带有geneplus（包括大小写）'))
      return
    }
  }
  callback()
}
